package com.power.sifa.approve.service;

import com.plf.core.base.model.Ha_attachment;
import com.power.sifa.approve.model.Aprv_materials_options;
import com.power.sifa.approve.model.Aprv_process_materials;
import com.power.sifa.approve.model.enumeration.Tp_procmaterialEnum;
import com.power.sifa.approve.model.pageInfo.Aprv_materials_optionsPageInfo;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.RequestBody;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 *  表单输入动态生成的材料文件业务层
 */
public interface Aprv_materials_optionsService {

    /**
     *  根据id获取表单输入动态生成的材料文件对象
     */
    Aprv_materials_options getById(Serializable id);

    /**
     *  根据传入表单输入动态生成的材料文件对象进行新增或更新操作
     */
    void saveOrUpdate(Aprv_materials_options aprv_materials_options);

    /**
     *  根据id删除表单输入动态生成的材料文件
     */
    void removeById(Serializable id);

    /**
     *  根据传入条件查询表单输入动态生成的材料文件分页结果
     */
    Page<Aprv_materials_options> findAll(Aprv_materials_optionsPageInfo pageInfo);
    
    /**
     * 查询全部表单输入动态生成的材料文件
     */
    List<Aprv_materials_options> findAll();
    
     /**
     *  根据id批量删除表单输入动态生成的材料文件
     */
    void removeByIds(List<String> list);
    
     /**
     *  批量保存表单输入动态生成的材料文件
     */
    void saveAll(List<Aprv_materials_options> list);


    /**
     * FIXME: 之前用于表单编辑预览，后被在线编辑替代(弃用)
     *  批量保存表单输入动态生成的材料文件
     */
    List<Aprv_materials_options> findAllOptionsByApplyid(String applyid);

    /**
     *
     *  通过materialid查询对应的版本记录数据
     */
    List<Aprv_materials_options> findAllOptionsByMaterialId(String materialId);



    /**
     * 通过attachId查询对应的表单数据
     * @param attachId
     * @return
     */
    Aprv_materials_options findOneOptionsByAttachId(String attachId);

    /**
     * FIXME: 之前用于表单编辑预览，后被在线编辑替代(弃用)
     * 通过materialType查询对应的表单数据
     * @param applyid
     * @param materialType
     * @return
     */
    List<Aprv_materials_options> findAllOptionsByMaterialType(String applyid, Integer materialType);

    /**
     * FIXME: 之前用于表单编辑预览，后被在线编辑替代(弃用)
     * 保存操作记录的文件
     * @param attachment
     * @param applyid
     * @param busiType
     * @param userId
     * @param userName
     * @param procmaterialEnum
     * @param docfield
     * @return
     * @throws Exception
     */
     Aprv_materials_options saveOptionMaterial(Ha_attachment attachment, String applyid, Integer busiType,
                                                     String userId, String userName, Tp_procmaterialEnum procmaterialEnum,
                                                     Map<String,Object> docfield) throws Exception;

    /**
     * FIXME: 之前用于表单编辑预览，后被在线编辑替代(弃用)
     * 更新操作记录的文件
     * @param attachment
     * @param applyid
     * @param optionid
     * @param busiType
     * @param userId
     * @param userName
     * @param docfield
     * @return
     * @throws Exception
     */
    Aprv_materials_options updateOptionMaterial(Ha_attachment attachment, String applyid, String optionid, Integer busiType,
                                                       String userId, String userName, Map<String, Object> docfield) throws Exception;



    /**
     * FIXME: 之前用于表单编辑预览，后被在线编辑替代(弃用)
     * 操作记录的文件
     * @param attachment
     * @param applyid
     * @param optionid
     * @param busiType
     * @param docfield
     * @return
     * @throws Exception
     */
    Aprv_materials_options endOptionMaterial(Ha_attachment attachment, String applyid, String optionid,
                                             Integer busiType, Map<String, Object> docfield) throws Exception;


    /**
     * 保存材料的初始化方法，生成一条对应的初始化版本记录数据
     * @param material
     * @param userId
     */
    void initMaterialOptions(Aprv_process_materials material, String userId);



    /**
     * 查找当前记录的最大版本号
     * @param materialId
     * @return
     */
    Integer findMaxVersion(String materialId);

    /**
     * 删除操作记录及其版本数据
     * @param materialid
     * @return
     * @throws Exception
     */
    void deleteMaterialOptions(String materialid)throws Exception;


    /**
     * 通过材料文件的id查询对应的历史版本数据
     * @param materialIds
     * @return
     */
    Map<String,List<Aprv_materials_options>> findOldOptionMaterialMap(@RequestBody List<String> materialIds);
}
